package com.hzw.saas.common.pay.alipay.bean;

import java.util.ArrayList;
import java.util.List;

import com.alibaba.fastjson.JSON;
import com.alipay.api.internal.util.StringUtils;
import lombok.Getter;

/**
 * alipay.trade.query(统一收单线下交易查询) biz_content参数
 * https://opendocs.alipay.com/apis/api_1/alipay.trade.query
 *
 * @author zzl
 * @since 2020-09-23
 */
@Getter
public class AliQueryReqContent extends AliTradeReqContent {

    // 参数命名方式与支付宝参数保持一致

    /**
     * 订单支付时传入的商户订单号,和支付宝交易号不能同时为空
     * 注：trade_no,out_trade_no如果同时存在优先取trade_no
     */
    private String out_trade_no;

    /**
     * 支付宝交易号，和商户订单号不能同时为空
     */
    private String trade_no;

    /**
     * 银行间联模式下有用，其它场景请不要使用
     * 双联通过该参数指定需要查询的交易所属收单机构的pid
     */
    private String org_pid;

    /**
     * 查询选项，商户通过上送该参数来定制同步需要额外返回的信息字段，数组格式
     * 如：["trade_settle_info","fund_bill_list","voucher_detail_list","discount_goods_detail"]
     */
    private List<String> query_options;


    @Override
    public String buildBizContent() {
        if (StringUtils.isEmpty(out_trade_no) && StringUtils.isEmpty(trade_no)) {
            throw new IllegalArgumentException("out_trade_no商户订单号与trade_no支付宝交易号不能同时为空！");
        }

        return JSON.toJSONString(this);
    }

    public static AliQueryReqContent build() {
        return new AliQueryReqContent();
    }

    public AliQueryReqContent out_trade_no(String outTradeNo) {
        this.out_trade_no = outTradeNo;
        return this;
    }

    public AliQueryReqContent trade_no(String tradeNo) {
        this.trade_no = tradeNo;
        return this;
    }

    public AliQueryReqContent org_pid(String orgPid) {
        this.org_pid = orgPid;
        return this;
    }

    public AliQueryReqContent trade_settle_info() {
        if (this.query_options == null) {
            this.query_options = new ArrayList<>();
        }
        this.query_options.add("trade_settle_info");
        return this;
    }

    public AliQueryReqContent fund_bill_list() {
        if (this.query_options == null) {
            this.query_options = new ArrayList<>();
        }
        this.query_options.add("fund_bill_list");
        return this;
    }

}
